#!/usr/bin/env python3
"""
详细调试脚本
用于检查应用程序的Python环境、数据库连接和实际使用的数据库文件
"""
import os
import sys
import sqlite3
import sqlalchemy
from sqlalchemy import create_engine
from pathlib import Path

print("=" * 80)
print("详细环境与数据库调试工具")
print("=" * 80)

# 1. 检查Python环境
print("\n1. Python环境信息:")
print(f"Python解释器路径: {sys.executable}")
print(f"Python版本: {sys.version}")
print(f"当前工作目录: {os.getcwd()}")
print(f"脚本所在目录: {os.path.dirname(os.path.abspath(__file__))}")

# 2. 检查SQLAlchemy信息
print("\n2. SQLAlchemy信息:")
print(f"SQLAlchemy版本: {sqlalchemy.__version__}")
print(f"SQLAlchemy安装路径: {os.path.dirname(sqlalchemy.__file__)}")

# 3. 检查数据库配置
print("\n3. 数据库配置检查:")
database_config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "app", "core", "database.py")
print(f"数据库配置文件: {database_config_path}")
print(f"配置文件存在: {os.path.exists(database_config_path)}")

# 尝试导入配置并检查DATABASE_URL
if os.path.exists(database_config_path):
    try:
        # 添加项目根目录到Python路径
        sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
        from app.core.database import DATABASE_URL, engine
        print(f"\n从配置文件导入的DATABASE_URL: {DATABASE_URL}")
        print(f"SQLAlchemy引擎URL: {engine.url}")
        
        # 解析SQLite路径
        if str(engine.url).startswith('sqlite:///'):
            # 提取相对路径部分
            db_path_part = str(engine.url)[10:]  # 移除 'sqlite:///'
            # 计算绝对路径
            if db_path_part.startswith('./'):
                # 相对于脚本所在目录
                abs_db_path = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), db_path_part))
            else:
                abs_db_path = os.path.abspath(db_path_part)
            print(f"解析后的绝对数据库路径: {abs_db_path}")
            print(f"数据库文件存在: {os.path.exists(abs_db_path)}")
            
            # 如果文件存在，检查其表结构
            if os.path.exists(abs_db_path):
                print("\n4. 检查数据库表结构:")
                try:
                    conn = sqlite3.connect(abs_db_path)
                    cursor = conn.cursor()
                    
                    # 检查表是否存在
                    cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='file_uploads';")
                    table_exists = cursor.fetchone()
                    print(f"file_uploads表存在: {bool(table_exists)}")
                    
                    # 检查表结构
                    if table_exists:
                        print("\n表结构详情:")
                        print("-" * 60)
                        cursor.execute("PRAGMA table_info(file_uploads);")
                        columns = cursor.fetchall()
                        
                        has_departure_column = False
                        for col in columns:
                            col_id, col_name, col_type, not_null, default_val, pk = col
                            print(f"{col_name:<30} | {str(col_type):<20} | {str(default_val):<10}")
                            if col_name == 'departure_retention_status':
                                has_departure_column = True
                        
                        print("-" * 60)
                        print(f"departure_retention_status列存在: {has_departure_column}")
                        print(f"总列数: {len(columns)}")
                    
                    conn.close()
                except Exception as e:
                    print(f"检查数据库时出错: {e}")
    except Exception as e:
        print(f"导入数据库配置时出错: {e}")
        print(f"错误类型: {type(e).__name__}")
        import traceback
        print(f"详细错误: {traceback.format_exc()}")

# 5. 检查虚拟环境
print("\n5. 虚拟环境检查:")
venv_path = os.environ.get('VIRTUAL_ENV', '未设置')
print(f"VIRTUAL_ENV环境变量: {venv_path}")

# 检查site-packages目录
site_packages = [p for p in sys.path if 'site-packages' in p]
print(f"\nPython路径中的site-packages目录:")
for sp in site_packages:
    print(f"  - {sp}")

# 6. 检查是否有其他可能的数据库文件
print("\n6. 搜索所有可能的数据库文件:")
all_db_files = []
for root, dirs, files in os.walk(os.path.dirname(os.path.abspath(__file__))):
    # 限制搜索深度
    depth = len(Path(root).relative_to(os.path.dirname(os.path.abspath(__file__))).parts)
    if depth > 3:
        continue
    
    for file in files:
        if file.endswith('.db'):
            file_path = os.path.join(root, file)
            rel_path = os.path.relpath(file_path, os.path.dirname(os.path.abspath(__file__)))
            file_size = os.path.getsize(file_path) / 1024  # KB
            all_db_files.append((rel_path, file_size, file_path))

if all_db_files:
    print(f"找到 {len(all_db_files)} 个数据库文件:")
    for rel_path, size, full_path in all_db_files:
        print(f"  - {rel_path} ({size:.2f} KB) [完整路径: {full_path}]")
else:
    print("未找到数据库文件")

# 7. 诊断报告
print("\n=" * 40)
print("诊断报告")
print("=" * 80)

# 检查是否使用了错误的虚拟环境
if 'djangoProject' in sys.executable or any('djangoProject' in sp for sp in site_packages):
    print("⚠️  严重问题: 应用程序正在使用djangoProject的虚拟环境!")
    print("  这可能导致数据库连接和依赖问题")
    print("\n解决方案:")
    print("1. 激活正确的虚拟环境:")
    print("   source ./venv/bin/activate")
    print("2. 然后重新启动应用程序")
else:
    print("虚拟环境路径检查正常，未发现明显错误")

# 检查数据库路径问题
if os.path.exists(abs_db_path if 'abs_db_path' in locals() else ''):
    print("\n数据库文件存在，路径正确")
else:
    print("⚠️  警告: 数据库文件不存在或路径不正确")

print("\n完整建议:")
print("1. 确保使用正确的虚拟环境")
print("2. 验证DATABASE_URL指向正确的数据库文件")
print("3. 确保数据库迁移已正确执行")
print("4. 检查应用程序日志以获取更多线索")
print("=" * 80)